﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLPresupuestosClientes
    /// </summary>
    class BLIMPLPresupuestosClientes:Presupuesto_BL.BLPresupuestosClientes
    {
        DAOPresupuestosClientes createPresupuestoCliente = DAOFactoryPresupuesto.createPresupuestoCliente();
        BLClientes createCliente = BLFactoryPresupuesto.createCliente();
        BLPresupuestos createPresupuesto = BLFactoryPresupuesto.createPresupuesto();

        /// <summary>
        /// Guarda un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="preCli">Objeto con los datos que relacionan el presupuesto con el cliente</param>
        /// <returns>Devuelve true si fue ingresado correctamten o false si falló</returns>
        public bool savePresupuestoCliente(presupuestosClientesDTO preCli)
        {
            Boolean correcto = false;

            try
            {
                presupuestosDTO p = createPresupuesto.getPresupuesto(preCli.CodigoPresupuesto);
                clientesDTO c = createCliente.getCliente(preCli.NombreCliente);
                
                if (null != p && null != c)
                {
                    Boolean insertado = createPresupuestoCliente.savePresupuestoCliente(p.ID, c.ID);

                    if (insertado)
                    {
                        correcto = true;
                    }    
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="preCli">Objeto con los datos que relacionan el presupuesto con el cliente</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoCliente(presupuestosClientesDTO preCli)
        {
            Boolean correcto = false;

            try
            {
                presupuestosDTO p = createPresupuesto.getPresupuesto(preCli.CodigoPresupuesto);
                clientesDTO c = createCliente.getCliente(preCli.NombreCliente);

                if (null != p && null != c)
                {
                    Boolean modificado = createPresupuestoCliente.updatePresupuestoCliente(p.ID, c.ID, preCli.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="id">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoCliente(int id)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createPresupuestoCliente.deletePresupuestoCliente(id);

                if (eliminado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista todos los presupuestos asociados a clientes
        /// </summary>
        /// <returns>Devuelve una tabla con los presupuestos y sus clientes</returns>
        public DataTable getAllPresupuestoCliente()
        {
            DataTable listadoPresupuestoClientes = null;

            try
            {
                DataTable precli = createPresupuestoCliente.getAllPresupuestoCliente();

                if (null != precli)
                {
                    listadoPresupuestoClientes = precli;
                    
                }
                   
            }
            catch (Exception ex)
            {

                listadoPresupuestoClientes = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoPresupuestoClientes;
        }

        /// <summary>
        /// Obtiene un presupuesto asociado a un cliente
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuestoCliente</returns>
        public presupuestosClientesDTO getPresupuestoCliente(string codigoPresupuesto)
        {
            presupuestosClientesDTO precli = null;

            try
            {
                presupuestosClientes pc = createPresupuestoCliente.getPresupuestoCliente(codigoPresupuesto);

                if (null != pc)
                {
                    precli = new presupuestosClientesDTO();
                    precli.ID = pc.ID;
                    precli.NombreCliente = pc.NombreCliente;
                    precli.Precio = pc.Precio;
                    precli.TipoPresupuesto = pc.TipoPresupuesto;
                    precli.Fecha = pc.Fecha;
                    precli.CodigoPresupuesto = pc.CodigoPresupuesto;
                    precli.EstadoPresupuesto = pc.EstadoPresupuesto;
                }
            }
            catch (Exception ex)
            {

                precli = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return precli;
        }
    }
}
